PostgreSQL pg_bulkload 限制场景

1 背景知识

本文介绍使用 pg_bulkload 一些限制场景。

2 DIRECT 导入表方法

pg_bulkload 目前支持将数据加载至 heap 访问方法的表中。在 PostgreSQL 12 中进行了修订,现在可以通过可插拔API 对表进行访问。

3 错误编码 pg_bulkload

以下显示了 pg_bulkload 可能返回的代码。用于 PostgreSQL pg_bulkload 错误诊断。

Return code Description
0 Success
1 Error occurred during running SQL in PostgreSQL
2 Failed to connect to PostgreSQL
3 Success, but some data could not be loaded

4 DIRECT 模式

如果使用 DIRECT 或者 PARALLEL 模式,你需要考虑以下问题:

4.1 PostgreSQL 启动时的数据库恢复

pg_bulkload 遇到数据库崩溃时,此时 $PGDATA/pg_bulkload/.loadstatus 文件依旧存在,可以使用 postgresql 脚本调用 pg_bulkload -r 命令恢复数据库。

Warning

postgresql 脚本会正确的启动或者停止数据库。我们不建议直接使用 pg_ctl

由于windows 操作系统中不包括 postgresql 脚本。所以您必须手动调用 pg_bulkload -r 命令,以用于恢复数据库。

4.2 PITR/Replication

由于绕过了 WAL 日志,所以无法使用归档进行 PITR 恢复。如果想要使用 PITR 请在 pg_bulkload 导入数据之后,对数据库进行完成备份。

如果搭建了流复制的话,则需要重新创建备节点。以保证数据正常同步。

4.3 loadstatus文件

此文件存在于 $PGDATA/pg_bulkload 目录。pg_bulkload 崩溃之后需要使用此文件恢复数据库。

5  禁用 kill -9 命令

尽量不要使用 kill -9 终止 pg_bulkload 命令。如果使用了 kill -9,如果想要数据得到保证,则必须调用 postgresql 脚本来执行恢复并重启数据库。

6 多进程并发导入时,身份验证失败

当设置 MUTI_PROCESS=YES 时,是需要密码才能通过 localhost 连接到导入的数据库时,即使输入正确密码,也会验证失败。为了避免下面的情况,请配置以下任何一种方法。

6.1 使用 trust 方法验证来自 localhost 的连接

  1. UNIXLINUX
# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD [for UNIX]
local   all             foo                                     trust

6.2 设置 .pgpass 文件

localhost:5432:*:foo:foopass

7 数据库约束

默认情况下,数据导入只会执行唯一约束和非空约束。可以设置 CHECK_CONSTRAINTS=YES 参数去检查检查约束。现目前无法检查外检约束。外键数据的合法性需要用户自己保证。